#pragma once
#include <string>
#include <vector>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include "Log.hpp"
#include "InetAddr.hpp"

using namespace LogModule;

class Route
{
private:
    bool Exist(const InetAddr &inetaddr)
    {
        for (auto &user : _online_users)
        {
            if (user == inetaddr)
            {
                return true;
            }
        }
        return false;
    }
    // 添加在线用户
    void AddUser(const InetAddr &inetaddr)
    {
        _online_users.emplace_back(inetaddr);
        LOG(LogLevel::INFO) << "添加用户成功，用户："
                            << inetaddr.IpString() << ":" << inetaddr.Port();
    }
    // 删除在线用户
    void DeleteUser(const InetAddr &inetaddr)
    {
        for (auto it = _online_users.begin(); it != _online_users.end(); it++)
        {
            if (*it == inetaddr)
            {
                _online_users.erase(it);
                break;
            }
        }
        LOG(LogLevel::INFO) << "删除用户成功，用户："
                            << inetaddr.IpString() << ":" << inetaddr.Port();
    }

public:
    Route()
    {
    }
    // 消息转发给所有在线用户，以服务端的名义sockfd
    void MessageRoute(int sockfd, const std::string &data, const InetAddr &inetaddr)
    {
        // 1.判断该用户是否在线，如果不在线，就要添加
        if (!Exist(inetaddr))
            AddUser(inetaddr);

        // 格式：（用户ip:port:数据）
        std::string message = "用户" + inetaddr.IpString() + ":" + std::to_string(inetaddr.Port()) + ":";
        message += data;

        // 2.消息转发，给所有人都发一条
        for (auto &user : _online_users)
        {
            ssize_t n = sendto(sockfd, message.c_str(), message.size(), 0,
                               (const struct sockaddr *)(user.Peer()), sizeof(struct sockaddr_in));
            (void)n;
        }

        // 3.如果data内容为QUIT，那么就删除对应用户
        if (data == "QUIT")
            DeleteUser(inetaddr);
    }
    ~Route()
    {
    }

private:
    std::vector<InetAddr> _online_users;
};